from typing import Any, Generic, Optional, TypeVar
from pydantic import BaseModel
from pydantic.generics import GenericModel

# 定义泛型类型变量
T = TypeVar('T')

# 定义API响应状态码
class ResponseCode:
    """API响应状态码
    
    定义API响应的统一状态码
    """
    SUCCESS = 20000  # 成功
    BAD_REQUEST = 40000  # 请求错误
    UNAUTHORIZED = 40100  # 未授权
    FORBIDDEN = 40300  # 禁止访问
    NOT_FOUND = 40400  # 资源不存在
    INTERNAL_ERROR = 50000  # 服务器内部错误

# 定义统一响应模型
class Response(GenericModel, Generic[T]):
    """统一响应模型
    
    所有API响应的标准格式
    """
    code: int  # 状态码
    message: str  # 响应消息
    data: Optional[T] = None  # 响应数据

    @classmethod
    def success(cls, data: Any = None, message: str = "操作成功"):
        """成功响应
        
        创建一个成功的响应对象
        
        Args:
            data: 响应数据
            message: 响应消息
            
        Returns:
            Response: 响应对象
        """
        return cls(
            code=ResponseCode.SUCCESS,
            message=message,
            data=data
        )
    
    @classmethod
    def fail(cls, code: int = ResponseCode.BAD_REQUEST, message: str = "操作失败", data: Any = None):
        """失败响应
        
        创建一个失败的响应对象
        
        Args:
            code: 状态码
            message: 响应消息
            data: 响应数据
            
        Returns:
            Response: 响应对象
        """
        return cls(
            code=code,
            message=message,
            data=data
        )
    
    @classmethod
    def error(cls, message: str = "服务器内部错误"):
        """服务器错误响应
        
        创建一个服务器错误的响应对象
        
        Args:
            message: 响应消息
            
        Returns:
            Response: 响应对象
        """
        return cls(
            code=ResponseCode.INTERNAL_ERROR,
            message=message
        ) 